package org.xxx.test.client;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.DigestUtils;

import java.time.Instant;
import java.util.*;

@Slf4j
public class SignUtil {

    //调用服务的身份标识
    public final static String APP_KEY = "Auth-Key";
    //调用服务的身份密钥
    public final static String APP_SECRET = "Auth-Secret";
    //10 位长度的unix时间戳
    public final static String TIMESTAMP = "Auth-TimeStamp";
    //随机数
    public final static String NONCE = "Auth-Nonce";
    //签名
    public final static String SIGN = "Auth-Sign";


    /**
     * post 请求参数不参与 签名
     */
    public static Map<String, String> getHeaderMap(String appKey, String appSecret) {
	return getHeaderMap(appKey, appSecret, null);
    }

    /**
     * get 请求参数签名
     *
     * @param appKey    应用唯一标识
     * @param appSecret 密钥
     * @param paramMap
     * @return 返回请求headerMap
     */
    public static Map<String, String> getHeaderMap(String appKey, String appSecret, Map<String, String> paramMap) {
	/*1、组装请求头*/
	Map<String, String> headerMap = new HashMap<>();
	headerMap.put(APP_KEY, appKey);
	headerMap.put(TIMESTAMP, String.valueOf(Instant.now().getEpochSecond()));
	headerMap.put(NONCE, Integer.toString(new Random().nextInt()));
	/*2、GET 请求加入签名 POST 中body 参数不参与签名*/
	SortedMap<String, String> signMap = new TreeMap<>();
	signMap.putAll(headerMap);
	if (paramMap != null) {
	    signMap.putAll(paramMap);
	}
	/*3、密钥参与签名*/
	signMap.put(APP_SECRET, appSecret);
	/*4、md5加密签名*/
	String sign = getSign(signMap);
	/*5、加入签名数据到请求头*/
	headerMap.put(SIGN, sign);
	return headerMap;
    }


    /**
     * @param obj 请求参数，类型 map，封装对象bean
     * @return
     */
//    public static Map<String, String> getParamsMap(Map<String, String> obj) {
//	Map<String, String> paramMap = new TreeMap<>();
//	if (obj instanceof Map) {
//	    paramMap.putAll((Map<? extends String, ? extends String>) obj);
//	} else {
//	    try {
//		Map<String, String> beanMap = BeanUtils.describe(obj);
//		beanMap.remove("class");
//		paramMap.putAll(beanMap);
//	    } catch (Exception e) {
//		e.printStackTrace();
//	    }
//	}
//	return paramMap;
//    }


    /**
     * @param params 有序的map 进行转换成json数据进行加密
     * @return 得到签名
     */
    public static String getSign(SortedMap<String, String> params) {
	//要先去掉 Url 里的 Sign
	params.remove(SIGN);
	String paramsJsonStr = JSONObject.toJSONString(params);
	return DigestUtils.md5DigestAsHex(paramsJsonStr.getBytes()).toUpperCase();
    }
}